# 保存日志

import logging  # 导入Python标准日志模块
import os  # 导入操作系统接口模块
import sys  # 导入系统特定的参数和函数
from datetime import datetime  # 导入日期时间处理模块
from typing import Optional  # 导入类型提示中的可选类型

class logger:
    """
    简化版自定义 Logger，支持日志输出和保存
    
    功能:
    - 控制台输出
    - 文件保存s
    - 时间戳记录
    - 自定义分隔符
    """
    
    def __init__(self, 
                 name: str = "SimpleLogger",
                 log_to_console: bool = True,
                 log_to_file: bool = False,
                 log_file: Optional[str] = None,
                 diff_str: str = "=",
                 separator: str = " | "):
        """
        初始化简化版 Logger
        
        Args:
            name: Logger 名称
            log_to_console: 是否输出到控制台
            log_to_file: 是否保存到文件
            log_file: 日志文件路径，如果为None且log_to_file为True，则自动生成
            separator: 日志字段分隔符
        """
        self.name = name
        self.separator = separator
        self.log_to_file = log_to_file
        self.log_file = log_file
        
        # 创建 logger
        self.logger = logging.getLogger(name)
        self.logger.setLevel(logging.DEBUG)
        self.logger.handlers.clear()  # 清除现有处理器
        
        # 创建格式化器
        formatter = logging.Formatter(
            f'%(asctime)s{separator}%(levelname)s{separator}%(message)s',
            datefmt='%Y-%m-%d %H:%M:%S'
        )
        
        # 控制台处理器
        if log_to_console:
# 创建一个控制台日志处理器，将日志输出到标准输出流（通常是控制台）
            console_handler = logging.StreamHandler(sys.stdout)
# 为控制台日志处理器设置格式化器，定义日志输出的格式
            console_handler.setFormatter(formatter)
# 将配置好的控制台日志处理器添加到logger对象中，使其生效
            self.logger.addHandler(console_handler)
        
        # 文件处理器
        if log_to_file:
            if log_file is None:
                # 生成默认日志文件名
                timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
                log_file = f"log_{timestamp}.txt"
            
            # 确保目录存在
            os.makedirs(os.path.dirname(os.path.abspath(log_file)), exist_ok=True)
            
# 创建一个文件处理器，用于将日志写入指定文件，并设置编码为utf-8
            file_handler = logging.FileHandler(log_file, encoding='utf-8')
# 为文件处理器设置格式化器，控制日志输出的格式
            file_handler.setFormatter(formatter)
# 将文件处理器添加到日志记录器中，使其能够开始处理日志
            self.logger.addHandler(file_handler)
            
# 将日志文件路径保存到实例变量中，方便后续使用
            self.log_file = log_file
    
        # 替代上面的写入逻辑
        if os.path.exists(log_file):
            with open(log_file, 'a', encoding='utf-8') as f:
                separator_line = f"\n{diff_str*25} {datetime.now().strftime('%Y-%m-%d %H:%M:%S')} {'='*20}\n\n"
                f.write(separator_line)


    def info(self, message: str):
        """记录信息级别日志"""
        self.logger.info(message)
    
    def debug(self, message: str):
        """记录调试级别日志"""
        self.logger.debug(message)
    
    def warning(self, message: str):
        """记录警告级别日志"""
        self.logger.warning(message)
    
    def error(self, message: str):
        """记录错误级别日志"""
        self.logger.error(message)
    
    def critical(self, message: str):
        """记录严重错误级别日志"""
        self.logger.critical(message)
    
    def log(self, level: str, message: str):
        """通用日志记录方法"""
        level = level.upper()
        if level == "INFO":
            self.info(message)
        elif level == "DEBUG":
            self.debug(message)
        elif level == "WARNING":
            self.warning(message)
        elif level == "ERROR":
            self.error(message)
        elif level == "CRITICAL":
            self.critical(message)
        else:
            self.info(message)  # 默认为 INFO 级别

    def set_level(self, level: str):
        """设置日志级别"""
        level = level.upper()
        if level == "DEBUG":
            self.logger.setLevel(logging.DEBUG)
        elif level == "INFO":
            self.logger.setLevel(logging.INFO)
        elif level == "WARNING":
            self.logger.setLevel(logging.WARNING)
        elif level == "ERROR":
            self.logger.setLevel(logging.ERROR)
        elif level == "CRITICAL":
            self.logger.setLevel(logging.CRITICAL)


# 示例用法
if __name__ == "__main__":
    # 创建 logger 实例
    logger = logger(
        name="MyApp",
        log_to_console=True,
        log_to_file=True,
        log_file="app_log.txt",
        separator=" | "
    )
    
    # 设置日志级别
    logger.set_level("DEBUG")
    
    # 记录不同级别的日志
    logger.debug("这是一条调试信息")
    logger.info("这是一条普通信息")
    logger.warning("这是一条警告信息")
    logger.error("这是一条错误信息")
    logger.critical("这是一条严重错误信息")
    
    # 使用通用日志方法
    logger.log("INFO", "使用通用方法记录的信息")